package org.bopis.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.bopis.domain.UserContainer;
import org.bopis.form.PerfilUsuarioForm;
import org.bopis.form.ResetPasswordForm;
import org.bopis.general.Constantes;
import org.bopis.services.db.DAOUsuario;
import org.bopis.services.mail.MailSender;
import org.bopis.utilidades.Utilidades;

import com.boole.model.Usuario;

/**
 * Clase que se encarga de las acciones asociadas al perfil de usuario
 * @author i-fernandezmolina
 * 
 */
public class PerfilUsuarioActions extends CustomDispatchAction {

	
	/**
	 * Metodo quer carga en la request los datos del usuario
	 * @param mapping objeto ActionMapping
	 * @param form objeto ActionForm
	 * @param request objeto HttpServletRequest
	 * @param response objeto HttpServletResponse
	 * @return objeto Action Forward
	 * @throws Exception
	 */
	public ActionForward loadDatosPerfil(ActionMapping mapping, ActionForm form,
							  HttpServletRequest request, HttpServletResponse response)
    						  throws Exception {
		
		//obtenemos los datos de usuario de sesion
		Usuario usuario = ((UserContainer) getSessionObject(request, "userContainer")).getUsuario();
		
		//cargamos en el form los datos de usuario
		form = new PerfilUsuarioForm();
		((PerfilUsuarioForm) form).setScreenName(usuario.getScreenname());
		((PerfilUsuarioForm) form).setNombre(usuario.getNombre());
		((PerfilUsuarioForm) form).setApellido1(usuario.getApellido1());
		((PerfilUsuarioForm) form).setApellido2(usuario.getApellido2());
		((PerfilUsuarioForm) form).setEmpresa(usuario.getEmpresa());
		((PerfilUsuarioForm) form).setTelefono(usuario.getTelefono());
		((PerfilUsuarioForm) form).setEmail(usuario.getEmail());
		
		request.setAttribute("perfilUsuarioForm", form);
		
		request.setAttribute("screenName", usuario.getScreenname());
		
    	return mapping.findForward("Success");
  	}
	
	/**
	 * Metodo que actualiza los datos de perfil del usuario conectado
	 * @param mapping objeto ActionMapping
	 * @param form objeto ActionForm
	 * @param request objeto HttpServletRequest
	 * @param response objeto HttpServletResponse
	 * @return objeto Action Forward
	 * @throws Exception
	 */
	public ActionForward updateDatosPerfil(ActionMapping mapping, ActionForm form,
							  HttpServletRequest request, HttpServletResponse response)
    						  throws Exception {
		
		//variables
		PerfilUsuarioForm datos = (PerfilUsuarioForm) form;
		Usuario usuario = new Usuario();
		
		//recogemos los datos de la request
		usuario.setScreenname(datos.getScreenName());
		usuario.setNombre(datos.getNombre());
		usuario.setApellido1(datos.getApellido1());
		usuario.setApellido2(datos.getApellido2());
		usuario.setEmpresa(datos.getEmpresa());
		usuario.setContacto(datos.getContacto());
		usuario.setTelefono(datos.getTelefono());
		usuario.setEmail(datos.getEmail());
				
		//actualizamos los datos de usuario
		if(DAOUsuario.updateUsuario(usuario, ((UserContainer) getSessionObject(request, "userContainer")).getUsuario().getEmail())){
			UserContainer userContainer = new UserContainer();
			userContainer.setUsuario(DAOUsuario.getUsuarioByEmail(usuario.getEmail()));
			addObjectToSession(request, "userContainer", userContainer);
			addActionMessage(request, "perfil.update.success");
			return mapping.findForward("Success");
		}else{
			addActionError(request, "error", "perfil.update.error");
			return mapping.findForward("Failure");
		}
			
  	}
	
	/**
	 * Metodo que actualiza la contraseña del usuario
	 * @param mapping objeto ActionMapping
	 * @param form objeto ActionForm
	 * @param request objeto HttpServletRequest
	 * @param response objeto HttpServletResponse
	 * @return objeto Action Forward
	 * @throws Exception
	 */
	public ActionForward updatePassword(ActionMapping mapping, ActionForm form,
							  HttpServletRequest request, HttpServletResponse response)
    						  throws Exception {
		
		//variables
		Usuario usuario = null;
						
		//obtenemos al usuario de la sesion
		usuario = ((UserContainer) getSessionObject(request, "userContainer")).getUsuario();
		
		//actualizamos la password
		if(!DAOUsuario.updatePasswordUsuario(usuario.getEmail(), ((ResetPasswordForm) form).getPass1())){
			addActionError(request, "error", "forgot.pass.error");
		}
		
		//enviamos al usuario una notificacion de que se ha cambiado la password
		MailSender mailSender = new MailSender();
		String asunto =  Constantes.EMAIL_ASUNTO_PASSWORD_RESETED;
		String mensaje = Constantes.EMAIL_MENSAJE_PASSWORD_RESETED;
		mensaje = mensaje.replaceAll("email", usuario.getEmail());
		mensaje = mensaje.replaceAll("pass", ((ResetPasswordForm) form).getPass1());
		mensaje = mensaje.replaceAll("protocol", Constantes.APP_PROTOCOL);
		mensaje = mensaje.replaceAll("nameapp", Constantes.APP_NAME);
		if(Utilidades.isVacia(Constantes.APP_PORT))
			mensaje = mensaje.replaceAll("host", Constantes.APP_HOST);
		else
			mensaje = mensaje.replaceAll("host", Constantes.APP_HOST + ":" + Constantes.APP_PORT);
		
		mailSender.sendEmail(usuario.getEmail(), usuario.getScreenname(), asunto, mensaje);
		
		//borramos al usuario de la sesion
		request.getSession().removeAttribute("userResetPassword");
		
		addActionMessage(request, "forgot.pass.sent");
				
    	return mapping.findForward("Success");
  	}
	
	
	
	

}
